<?
// Controla els accessos a la base de dades
// Adaptat a PostgreSQL 7.3.x


class bd
{

	var $hConnex;
	var $bdInfo;
	var $lastQuery;
	var $errnum;
	var $errDescr;
	var $resultat;
	 
	function bd()
	{
		// Estableix la connexio amb la base de dades
		// i modifica errnum i errDesc
		 
		$this->bdInfo=new bddata();
		$cstr="dbname=".($this->bdInfo->nombd())." user=".($this->bdInfo->username())." password=".($this->bdInfo->password())." host=".($this->bdInfo->server());
		//@$this->hConnex=pg_connect($cstr);
		@$this->hConnex=pg_connect($cstr);
		$this->errnum=$this->hConnex;
		if (!($this->hConnex))
			$this->errDescr="CON_FAIL";
		else
			$this->errDescr="CON_OK";

		date_default_timezone_set("Europe/Madrid");	
	    
		 register_shutdown_function(array(&$this, "bdDestroy"));
	}

	 function bdDestroy()
	 {
		  // pseudodestructora
		  @pg_close($this->$hConnex);
	 }

	function query($sQuery)
	{
		 // Executa un query contra la base de dades
		 @$cadlog="[".$_REQUEST['sid']."] query (init ".date("H:i:s").")= ".$sQuery;
		 
/*		 $segonsValidesa=10;
		 		 
		 // Intent de cache
		 if (stristr($sQuery, "select")!==false)
		 {
			  $queryb64=md5($sQuery);
			  if ((!isset($_SESSION['query'][$queryb64])) || (isset($_SESSION['query'][$queryb64]) && $_SESSION['query'][$queryb64]['time']>time()+$segonsValidesa))
			  {
					// No tenim el query a la cache o no esta updatat.
					// Cal fer el query a la BD
*/					@$res=pg_query($this->hConnex, $sQuery);
					$this->errnum=$res;
					
					if (!$res)
					{
						 @$this->errDescr=pg_last_error($this->hConnex);
						 //loga("Query = ".$sQuery." *** ERROR = ".$this->errDescr);
					}
					else
					  $this->errDescr="Ok";
					
/*					$_SESSION['query'][$queryb64]['errdescr']=$this->errDescr;
					$_SESSION['query'][$queryb64]['time']=time();
			  }
			  // (si el query ja esta a la cache, nomes consultarem el hash en els getResultat)
		 }*/
		 
		 $this->lastQuery=$sQuery;
		 
		 $cadlog.=" ... ".date("H:i:s")." done";
		 //loga($cadlog);
	}
	
	
	function getResultat()
	{
		// Retorna un array amb el resultat de l'ultim query
		// La primera dimensio guarda la fila del query
		// La segona dimensio guarda la columna
		
		 unset($this->resultat);
		 $this->resultat=array();
		 
		 
/*		 $queryb64=md5($this->lastQuery);
		 $segonsValidesa=10;

		 if ((!isset($_SESSION['query'][$queryb64]['result'])) || (isset($_SESSION['query'][$queryb64]['result']) && $_SESSION['query'][$queryb64]['time']>time()+$segonsValidesa))
		 {
			  // El resultat encara no esta a la cache o ja ha caducat
*/			  $i=0;
			  while(@$resu=pg_fetch_row($this->errnum, $k))
			  {
					for ($j=0; $j<count($resu); $j++)
					  $this->resultat[$i][$j]=$resu[$j];
					$i++;
			  }
			  
/*			  $_SESSION['query'][$queryb64]['result']=$this->resultat;
		 }
		 else
		 {
			  // El query esta a la cache
			  $this->resultat=$_SESSION['query'][$queryb64]['result'];
		 }*/
		 
		 
		 return ($this->resultat);
	}
	

	function getResultatObj()
	{
		// Retorna un array d'objectes amb el resultat de l'ultim query
		// Cada objecte te els camps del plan text, p.e: $r[3]->kk
		// correspondria al camp "kk" de la 4a fila del resultat
		
		 unset($this->resultat);
		 $this->resultat=array();
		 
/*		 $queryb64=md5($this->lastQuery);
		 $segonsValidesa=10;

		 if ((!isset($_SESSION['query'][$queryb64]['result'])) || (isset($_SESSION['query'][$queryb64]['result']) && $_SESSION['query'][$queryb64]['time']>time()+$segonsValidesa))
		 {
			  // El resultat encara no esta a la cache o ja ha caducat*/
			  $i=0;
			  $this->resultat=array();
			  while (@$resu=pg_fetch_object($this->errnum, $k))
			  {
					$this->resultat[$i]=$resu;
					$i++;
			  }
/*			  $_SESSION['query'][$queryb64]['result']=$this->resultat;
		 }
		 else
		 {
			  // El query esta a la cache
			  $this->resultat=$_SESSION['query'][$queryb64]['result'];
		 }*/
		 		 
		 return ($this->resultat);
	}
	 

	function fullQuery($sQuery)
	{
		 // Executa un query contra la base de dades
		 // i retorna directament els resultats en un array
		 // ** NOMES QUERIES QUE RETORNIN FILES! **
		 $this->query($sQuery);
		 $res=$this->getResultat();
		 return ($res);
	}
	 
	
	function fullQueryObj($sQuery)
	{
		 // Executa un query contra la base de dades
		 // i retorna els resultats en un array d'objectes
		 // ** NOMES QUERIES QUE RETORNIN FILES! **
		 $this->query($sQuery);
		 $res=$this->getResultatObj();
		 return ($res);
	}
		  
	function count()
	{		 
		return (pg_num_rows($this->errnum));
	}
	
	
	function getErrnum()
	{ return ($this->errnum); }
	
	
	function getErrDescr()
	{ return ($this->errDescr); }
	
	
	function getLastQuery()
	{ return ($this->lastQuery); }
	
	
	function dumpResultat()
	{
		// Nomes utilitzar per debug!!
		$i=0;
		echo("<PRE>");
		for ($i=0; $i<count($this->resultat); $i++)
		{
			echo("<BR>");
			for ($j=0; $j<count($this->resultat[$i]); $j++)
			{
				$tmp=$this->resultat[$i][$j];
				echo("$tmp\t");
			}
		}
		echo("</PRE>");
	}
	
}

?>
